package com.javaee.ch11.web;


import com.javaee.ch11.common.response.ResultVo;
import com.javaee.ch11.entity.Reader;
import com.javaee.ch11.service.ReaderService;
import com.javaee.ch11.web.dto.ReaderQueryDto;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Min;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

@Validated
@RestController
@RequestMapping("/api/reader")
public class ReaderController {

    @Autowired
    ReaderService readerService;

    @PostMapping("/query")
    public ResultVo<List<Reader>> query(@RequestBody ReaderQueryDto queryDto) {
        return ResultVo.ok(readerService.queryReader(queryDto));
    }

    /**
     * 获取指定ID的书籍信息。
     *
     * @param id 书籍ID
     * @return 包含书籍对象的ResultVo
     */
    @GetMapping("/{id}")
    public ResultVo<Reader> get(@PathVariable long id) {
        Reader reader = readerService.getById(id);
        return ResultVo.ok(reader);
    }

    /**
     * 添加新书籍。
     *
     * @param reader 新书籍对象
     * @return 操作结果的ResultVo
     */
    @PostMapping("/")
    public ResultVo add(@Valid @RequestBody Reader reader) {
        readerService.add(reader);
        return ResultVo.ok();
    }

    /**
     * 更新书籍信息。
     *
     * @param reader 要更新的书籍对象
     * @return 操作结果的ResultVo
     */
    @PutMapping("/")
    public ResultVo update(@Valid @RequestBody Reader reader) {
        reader.setUpdatedTime(new Date());
        readerService.updateById(reader);
        return ResultVo.ok();
    }

    /**
     * 删除指定ID的书籍。
     *
     * @param id 书籍ID，不能小于0
     * @return 操作结果的ResultVo
     */
    @DeleteMapping("/{id}")
    public ResultVo delete(@PathVariable @Min(value = 0, message = "不能小于0") long id) {
        readerService.deleteById(id);
        return ResultVo.ok();
    }

    /**
     * 获取所有书籍列表。
     *
     * @return 包含书籍列表的ResultVo
     */
    @GetMapping("/")
    public ResultVo list() {
        return ResultVo.ok(readerService.listAll());
    }
 
}


